#ifndef CMD_GAME_HEAD_FILE
#define CMD_GAME_HEAD_FILE
#import "DataType.h"
//////////////////////////////////////////////////////////////////////////
//服务定义

//游戏属性
#define KIND_ID						999									//游戏 I D
#define GAME_NAME					TEXT("斗地主")						//游戏名字

//组件属性
#define GAME_PLAYER					3									//游戏人数
#define VERSION_SERVER				PROCESS_VERSION(6,0,3)				//程序版本
#define VERSION_CLIENT				PROCESS_VERSION(6,0,3)				//程序版本

//////////////////////////////////////////////////////////////////////////
//数目定义

#define MAX_COUNT					20									//最大数目
#define FULL_COUNT					54									//全牌数目
#define BACK_COUNT					3									//底牌数目
#define NORMAL_COUNT				17									//常规数目
#define GOOD_CARD_COUTN				38									//好牌数目

//////////////////////////////////////////////////////////////////////////

//数值掩码
#define	MASK_COLOR					0xF0								//花色掩码
#define	MASK_VALUE					0x0F								//数值掩码

//扑克类型
#define CT_ERROR					0									//错误类型
#define CT_SINGLE					1									//单牌类型
#define CT_DOUBLE					2									//对牌类型
#define CT_THREE					3									//三条类型
#define CT_SINGLE_LINE				4									//单连类型
#define CT_DOUBLE_LINE				5									//对连类型
#define CT_THREE_LINE				6									//三连类型
#define CT_THREE_LINE_TAKE_ONE		7									//三带一单
#define CT_THREE_LINE_TAKE_TWO		8									//三带一对
#define CT_FOUR_LINE_TAKE_ONE		9									//四带两单
#define CT_FOUR_LINE_TAKE_TWO		10									//四带两对
#define CT_BOMB_CARD				11									//炸弹类型
#define CT_MISSILE_CARD				12									//火箭类型

//////////////////////////////////////////////////////////////////////////
//状态定义

#define GAME_SCENE_FREE				GAME_STATUS_FREE					//等待开始
#define GAME_SCENE_CALL				GAME_STATUS_PLAY					//叫分状态
#define GAME_SCENE_PLAY				GAME_STATUS_PLAY+1					//游戏进行

//////////////////////////////////////////////////////////////////////////
//命令定义

#define SUB_S_GAME_START			100									//游戏函数
#define SUB_S_CALL_SCORE			101									//用户叫分
#define SUB_S_BANKER_INFO			102									//庄家信息
#define SUB_S_OUT_CARD				103									//用户出牌
#define SUB_S_PASS_CARD				104									//用户放弃
#define SUB_S_GAME_END				105									//游戏结束
#define SUB_S_PHRASE				106									//玩家发言
#define SUB_S_USERINFO				201									//玩家信息
#define SUB_S_USER_STAND_UP         202                                 //玩家离开
#define SUB_S_RERANDCARD            203                                 //重新洗牌

//玩家信息
typedef struct CMD_S_USERINFO
{
	int								cbGender;
	DWORD							lScore;
	BYTE							cbUserStatus;
	WORD							wChairID;
	WORD							wFaceID;
	TCHAR							szNickName[32];
}CMD_S_USERINFO;
//空闲状态
typedef struct CMD_S_StatusFree
{
	//单元积分
	int				    			lCellScore;							//单元积分
	
	//历史积分
	int 							lTurnScore[GAME_PLAYER];			//积分信息
	int							 lCollectScore[GAME_PLAYER];			//积分信息
}CMD_S_StatusFree;

//叫分状态
typedef struct CMD_S_StatusCall
{
	//游戏信息
	int		     					lCellScore;							//单元积分
	WORD							wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分
	BYTE							cbScoreInfo[GAME_PLAYER];			//叫分信息 3
	BYTE							cbHandCardData[NORMAL_COUNT];		//手上扑克 17
	//+3  27
	//历史积分
	int 							lTurnScore[GAME_PLAYER];			//积分信息
	int								lCollectScore[GAME_PLAYER];			//积分信息
}CMD_S_StatusCall;

//机器人扑克
struct CMD_S_AndroidCard
{
	BYTE							cbHandCard[GAME_PLAYER][NORMAL_COUNT];//手上扑克
	WORD							wCurrentUser ;						  //当前玩家
};

//游戏状态
typedef struct CMD_S_StatusPlay
{
	//游戏变量
	int 							lCellScore;							//单元积分
	WORD							wBombCount;							//炸弹倍数
	WORD							wBankerUser;						//庄家用户
	WORD							wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分
	//+1 11
	
	//出牌信息
	WORD							wTurnWiner;							//胜利玩家
	BYTE							cbTurnCardCount;					//出牌数目
	BYTE							cbTurnCardData[MAX_COUNT];			//出牌数据 20
	
	//扑克信息
	BYTE							cbBackCard[3];						//游戏底牌 3
	BYTE							cbHandCardData[MAX_COUNT];			//手上扑克 20
	BYTE							cbHandCardCount[GAME_PLAYER];		//扑克数目 3
	
	//60
	//历史积分
	int 							lTurnScore[GAME_PLAYER];			//积分信息
	int 							lCollectScore[GAME_PLAYER];			//积分信息
	
}CMD_S_StatusPlay;

//发送扑克
struct CMD_S_GameStart
{
	WORD				 			wCurrentUser;						//当前玩家
	WORD							wStartChairId;						//开始发牌玩家
	BYTE							cbValidCardData;					//明牌
	BYTE							cbValidCardIndex;					//明牌位置
	BYTE							cbCardData[NORMAL_COUNT];			//扑克列表
};

//用户叫分
struct CMD_S_CallScore
{
	WORD				 			wCurrentUser;						//当前玩家
	WORD							wCallScoreUser;						//叫分玩家
	BYTE							cbCurrentScore;						//当前叫分
	BYTE							cbUserCallScore;					//叫分玩家所叫分数
};

//庄家信息
struct CMD_S_BankerInfo
{
	WORD				 			wBankerUser;						//庄家玩家
	WORD				 			wCurrentUser;						//当前玩家
	BYTE							cbBankerScore;						//庄家叫分
	BYTE							cbBackCard[3];						//底牌扑克
};

//用户出牌
struct CMD_S_OutCard
{
	BYTE							cbCardCount;						//出牌数目
	WORD				 			wCurrentUser;						//当前玩家
	WORD							wOutCardUser;						//出牌玩家
	BYTE							cbCardData[MAX_COUNT];				//扑克列表
};

//放弃出牌
struct CMD_S_PassCard
{
	BYTE							cbTurnOver;							//一轮结束
	WORD				 			wCurrentUser;						//当前玩家
	WORD				 			wPassCardUser;						//放弃玩家
};

//游戏结束
struct CMD_S_GameEnd
{
	//游戏信息
	WORD							wBombCount[GAME_PLAYER];			//炸弹个数
	BYTE							cbCallScore;						//叫分数目
	int								bChunTian;							//春天
	int								bFanChunTian;						//反春天
	BYTE							cbCardCount[GAME_PLAYER];			//扑克数目
	BYTE							cbHandCardData[FULL_COUNT];			//扑克列表

	//积分变量
	int								lCellScore;							//单元积分
	int							    lGameScore[GAME_PLAYER];			//游戏积分
};

//玩家发言
struct CMD_S_Phrase
{
	WORD							wPhraseUser;						//发言玩家
	int								nPhraseIndex;						//发言索引
};

//用户离开
struct CMD_S_UserStandUp 
{
	WORD							chairID;                            //玩家的椅子号
};

//////////////////////////////////////////////////////////////////////////
//命令定义

#define SUB_C_CALL_SCORE			1									//用户叫分
#define SUB_C_OUT_CARD				2									//用户出牌
#define SUB_C_PASS_CARD				3									//用户放弃
#define SUB_C_PHRASE				4									//玩家发言

//用户叫分
struct CMD_C_CallScore
{
	BYTE							cbCallScore;						//叫分数目
};

//用户出牌
struct CMD_C_OutCard
{
	BYTE							cbCardCount;						//出牌数目
	BYTE							cbCardData[MAX_COUNT];				//扑克数据
};

//发送语音
struct CMD_C_Phrase
{
	int								nPhraseIndex;						//短语标识
};

//////////////////////////////////////////////////////////////////////////

#endif